// 版权2019 etcd作者
// 
// 根据Apache许可证2.0版（以下简称“许可证”）获得许可；
// 除非遵守许可证，否则不得使用此文件。
// 您可以通过
// 
// www.apache.org/licenses/LICENSE-2.0 
// 
// 除非适用法律要求或书面同意，否则根据许可证分发的软件
// 按“原样”分发，
// 无任何明示或暗示的保证或条件。
// 请参阅许可证，了解管理许可的特定语言和
// 许可证下的限制。

package quorum

import (
	"math"
	"strconv"
)

// 索引是一个筏板日志位置。
type Index uint64

func (i Index) String() string {
	if i == math.MaxUint64 {
		return "∞"
	}
	return strconv.FormatUint(uint64(i), 10)
}

// AckedIndex允许从相应的多数配置中查找投票者给定ID的提交索引。
type AckedIndexer interface {
	AckedIndex(voterID uint64) (idx Index, found bool)
}

type mapAckIndexer map[uint64]Index

func (m mapAckIndexer) AckedIndex(id uint64) (Index, bool) {
	idx, ok := m[id]
	return idx, ok
}

// VoteResult表示投票结果。
// 
// go:generate stringer-type=VoteResult 
type VoteResult uint8

const (
	// VotePending表示投票决定取决于未来的
	// 投票，即“是”或“否”尚未达到法定人数。
	VotePending VoteResult = 1 + iota
	// VoteLost表示法定人数投了反对票。
	VoteLost
	// VoteWon表示法定人数投票赞成。
	VoteWon
)
